#pragma once
#include <string>
#include <iostream>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <strings.h>

class Sockaddr
{
public:
    //用于服务器
    Sockaddr(in_port_t port)
        : _port(port)
        , _len(sizeof(_addr_in))
    {
        bzero((void*)&_addr_in, sizeof(_addr_in));
        _addr_in.sin_family = AF_INET;
        _addr_in.sin_addr.s_addr = INADDR_ANY;
        _addr_in.sin_port = htons(_port);
    }

    //用于服务器接收到信息后，拿到client端的信息我
    Sockaddr(sockaddr_in& sock_in)
        : _addr_in(sock_in)
    {
        _ip = inet_ntoa(_addr_in.sin_addr);
        _port = ntohs(_addr_in.sin_port);
    }

    Sockaddr(std::string& ip, in_port_t port)
        : _ip(ip)
        , _port(port)
        , _len(sizeof(_addr_in))
    {
        bzero((void*)&_addr_in, sizeof(_addr_in));
        _addr_in.sin_family = AF_INET;
        _addr_in.sin_addr.s_addr = inet_addr(_ip.c_str());
        _addr_in.sin_port = htons(_port);
    }

    ~Sockaddr()
    {}

    sockaddr_in& addr_in() {return _addr_in;}
    socklen_t& len() {return _len;}
    std::string& ip() {return _ip;}
    in_port_t port() {return _port;}

    std::string PrintDebug()
    {
        char buffer[100];
        snprintf(buffer, sizeof(buffer), "[%s][%d]", _ip.c_str(), _port);
        return buffer;
    }

private:
    std::string _ip;
    in_port_t _port;
    sockaddr_in _addr_in; //存放ip地址和port端口号的数据结构
    socklen_t _len;       //sockaddr_in的长度
};
